package cn.cihon.ubi.qorosauto.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

import clojure.main;

/**
 * @author guodawei
 * @since 2015/4/18 "ModelPara.csv" 读取ModelPara.csv，并根据文件评级计算行程得分。 包含以下评分：
 *        stdAcc,TypicalAcc,TypicalDcc,MaxAcc,MaxDcc,
 *        WQAcc,WQDcc,WQTcc,QAccNum,QDccNum,
 *        rpmPkm,Tdriving,TimesSS,ExtraRPM,AvgIdleRPM
 */
public class ModelPara {

	private static final ModelPara instance = new ModelPara();
	
	public static ModelPara getInstance() {
		return instance;
	}
	
	private HashMap<String, List<Double>> mp = new HashMap<String, List<Double>>();

	/**
	 * 读取文件构造评分依据
	 * 
	 * @param path
	 */
	private ModelPara() {

		InputStream in = this.getClass().getResourceAsStream("/ModelPara.csv"); 
		BufferedReader br = null;
		try {
			br = new BufferedReader(new InputStreamReader(in));
			String str = null;
			int cnt = 0;
			while ((str = br.readLine()) != null) {
				// 第一行是行标，存储在mp的key上
				if (cnt == 0) {
					String[] headers = str.split(",");
					for (int i = 0; i < headers.length; i++) {
						mp.put(headers[i], new ArrayList<Double>());
					}
				} else {
					// 第二行是列标，存储在对应各个key下的List中
					String[] values = str.split(",");
					mp.get("stdAcc").add(Double.valueOf(values[0]));
					mp.get("TypicalAcc").add(Double.valueOf(values[1]));
					mp.get("TypicalDcc").add(Double.valueOf(values[2]));
					mp.get("MaxAcc").add(Double.valueOf(values[3]));
					mp.get("MaxDcc").add(Double.valueOf(values[4]));
					mp.get("WQAcc").add(Double.valueOf(values[5]));
					mp.get("WQDcc").add(Double.valueOf(values[6]));
					mp.get("WQTcc").add(Double.valueOf(values[7]));
					mp.get("QAccNum").add(Double.valueOf(values[8]));
					mp.get("QDccNum").add(Double.valueOf(values[9]));
					mp.get("rpmPkm").add(Double.valueOf(values[10]));
					mp.get("Tdriving").add(Double.valueOf(values[11]));
					mp.get("TimesSS").add(Double.valueOf(values[12]));
					mp.get("ExtraRPM").add(Double.valueOf(values[13]));
					mp.get("AvgIdleRPM").add(Double.valueOf(values[14]));
				}
				cnt++;
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
	
	/**
	 * 读取文件构造评分依据
	 * 
	 * @param path
	 */
//	public ModelPara(String path) {
//
//		File file = new File(path);
//		FileReader fis = null;
//		BufferedReader br = null;
//		try {
//			fis = new FileReader(file);
//			br = new BufferedReader(fis);
//			String str = null;
//			int cnt = 0;
//			while ((str = br.readLine()) != null) {
//				// 第一行是行标，存储在mp的key上
//				if (cnt == 0) {
//					String[] headers = str.split(",");
//					for (int i = 0; i < headers.length; i++) {
//						mp.put(headers[i], new ArrayList<Double>());
//					}
//				} else {
//					// 第二行是列标，存储在对应各个key下的List中
//					String[] values = str.split(",");
//					mp.get("stdAcc").add(Double.valueOf(values[0]));
//					mp.get("TypicalAcc").add(Double.valueOf(values[1]));
//					mp.get("TypicalDcc").add(Double.valueOf(values[2]));
//					mp.get("MaxAcc").add(Double.valueOf(values[3]));
//					mp.get("MaxDcc").add(Double.valueOf(values[4]));
//					mp.get("WQAcc").add(Double.valueOf(values[5]));
//					mp.get("WQDcc").add(Double.valueOf(values[6]));
//					mp.get("WQTcc").add(Double.valueOf(values[7]));
//					mp.get("QAccNum").add(Double.valueOf(values[8]));
//					mp.get("QDccNum").add(Double.valueOf(values[9]));
//					mp.get("rpmPkm").add(Double.valueOf(values[10]));
//					mp.get("Tdriving").add(Double.valueOf(values[11]));
//					mp.get("TimesSS").add(Double.valueOf(values[12]));
//					mp.get("ExtraRPM").add(Double.valueOf(values[13]));
//					mp.get("AvgIdleRPM").add(Double.valueOf(values[14]));
//				}
//				cnt++;
//			}
//		} catch (FileNotFoundException e) {
//			e.printStackTrace();
//		} catch (IOException e) {
//			e.printStackTrace();
//		} finally {
//			try {
//				br.close();
//				fis.close();
//			} catch (IOException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//		}
//
//	}

	/**
	 * @param tripData
	 *            参与评分的数据值
	 * @param category
	 *            参与评分的项目，包括(stdAcc,TypicalAcc,TypicalDcc,MaxAcc,MaxDcc,WQAcc,
	 *            WQDcc,
	 *            WQTcc,QAccNum,QDccNum,rpmPkm,Tdriving,TimesSS,ExtraRPM,AvgIdleRPM
	 *            )
	 * @return 评分分值
	 */
	public double ModelMark(double tripData, String category) {
		List<Double> paras = mp.get(category);

		double finalMark = 0;
		double tmpMark = 0;
		int indexMark = 0;
		if (tripData < paras.get(0)) {
			finalMark = 0.0;
		} else if (tripData > paras.get(10)) {
			tmpMark = 100.0;
		} else {
			for (int i = 0; i < paras.size(); i++) {
				if (tripData < paras.get(i)) {
					indexMark = i;
					break;
				}
			}
			
			if (indexMark == 0) {
				finalMark = indexMark * 10;
			} else {
				if (paras.get(indexMark) == paras.get(indexMark - 1)) {
					finalMark = indexMark * 10;
				} else {
					finalMark = (tripData - paras.get(indexMark - 1)) * 10.0
							/ (paras.get(indexMark) - paras.get(indexMark - 1))
							+ 10 * (indexMark - 1);
				}
			}
		}
		return finalMark;
	}
	
	public static void main(String[] args) {
		ModelPara mp = new ModelPara();
		System.out.println(mp.ModelMark(-1.23880952381/3.6, "WQDcc")); // python 59.2 java -23
	}

}
